package gob.inei.enaho.model.service;

import gob.inei.enaho.model.dao.mapping.TablaHogar;
import gob.inei.enaho.model.domain.persona.Hogar;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import android.database.Cursor;

import util.android.sqlite.CommandSQLite;
import util.android.sqlite.SQLiteUtil;
import util.form.respuesta.RegistroImpl;
import util.www.sql.WhereSql;

public abstract class AbstractHogarService 
extends AbstractService
{
	public abstract String getNombreTabla();
	
	public void guardar_actualizar(Hogar hogar, RegistroImpl r) throws SQLException {		
		r.agregar(TablaHogar.CONGLOMERADO, hogar.getVivienda().getConglomerado().getCodigo());
		r.agregar(TablaHogar.VIVIENDA, hogar.getVivienda().getCodigo());
		r.agregar(TablaHogar.HOGAR, hogar.getCodigoString());
		SQLiteUtil.saveOrUpdate(getOpenHelper(), getNombreTabla(), r);
	}	
	
	
	protected final String findValorByColumna(Hogar hogar, Map<String,String> valoresClaveAdicionales, String columna) throws SQLException {
		RegistroImpl r = new RegistroImpl();
		r.agregar(TablaHogar.CONGLOMERADO, hogar.getVivienda().getConglomerado().getCodigo());
		r.agregar(TablaHogar.VIVIENDA, hogar.getVivienda().getCodigo());
		r.agregar(TablaHogar.HOGAR, hogar.getCodigoString());
		if(valoresClaveAdicionales!=null) {
			for(Map.Entry<String, String> e: valoresClaveAdicionales.entrySet()) {
				r.agregar(e.getKey(), e.getValue());
			}
		}
		String v = SQLiteUtil.findValorByColumna(getOpenHelper(), columna, getNombreTabla(), r); 
		return v==null?"":v;
	}
	
	protected final String crearWhere(Hogar hogar) throws SQLException {
		WhereSql w = new WhereSql();
		w.and(TablaHogar.CONGLOMERADO+"=", hogar.getVivienda().getConglomerado().getCodigo());
		w.and(TablaHogar.VIVIENDA+"=", hogar.getVivienda().getCodigo());
		w.and(TablaHogar.HOGAR+"=", hogar.getCodigoString());
		return w.getSql();
	}
	
	protected final RegistroImpl findById(
			Hogar hogar,	
			Map<String,String> valoresClaveAdicionales,
			final List<String> nombresInputs
			) throws Exception {
		final RegistroImpl r = new RegistroImpl();
		
		WhereSql w = new WhereSql();
		w.and(TablaHogar.CONGLOMERADO+"=", hogar.getVivienda().getConglomerado().getCodigo());
		w.and(TablaHogar.VIVIENDA+"=", hogar.getVivienda().getCodigo());
		w.and(TablaHogar.HOGAR+"=", hogar.getCodigoString());
		
		if(valoresClaveAdicionales!=null) {
			for(Map.Entry<String, String> e: valoresClaveAdicionales.entrySet()) {
				w.and(e.getKey()+"=", e.getValue());
			}
		}
		
		String sql = "select * from "+getNombreTabla() + w.getSql();
		SQLiteUtil.executeQueryUnaVez(getOpenHelper(), sql, new CommandSQLite() {			
			@Override
			public Object execute(Cursor cr) throws SQLException {
				for(String col : nombresInputs) {
					r.agregar(col, SQLiteUtil.getString(cr, col));
				}
				return null;
			}
		});
		
		return r;
	}
}
